<?php
/**********************************************************/
/*                                                        */
/*        name:   HTML 模板类                             */
/*    descript:   动态生成HTML模板文件，文件生成          */
/*                使用PHP描述，没有对应的HTML文件         */
/*      author:   firmit                                  */
/*        date:   2012-02-07                              */
/*      update:   2012-03-12                              */
/*        ToDO:   如何处理缓存，创建，删除，更新等        */
/*                                                        */
/*                                                        */
/**********************************************************/

// 定义目录分隔符
if(!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}

// HTML 模板类
// 在显示HTML元素的时候，调用HTMLSymbol类的display方法

class MC_DynaPageTmpl extends MC_Base {

    /** 
     * 存放模板的目录
     * @var String
     */
    var $template_dir;

    /**
     * 是否使用缓存
     * @var integer
     * 0 = no cache
     * 1 = use cache
     */
    var $cache=0;
 
    /**
     * 缓存目录
     * @var String
     */
    var $cache_dir;

    /** 
     * 缓存生存时间
     * @var integer
     */
    var $cache_lifetime;

    /** 
     * 配置文件目录
     * @var String
     */
    var $config_dir;

    /**
     * HTML文件头部
     * @var String
     */
    var $header;

    /**
     * 页面中内容的容器
     * 这个采用索引的数组方式
     * @var array MC_HtmlSymbol
     */
    var $arr_HTML_Con = array();

    /**
     * 存放html整页的 MC_HtmlSymbol
     * @var MC_HtmlSymbol
     */
    var $page;


    /** 
     * 调试模式
     * @var boolean
     * true = use debug 
     * false = stop debug (default)
     */
    var $debug = false;

    /**
     * 构造函数
     * @param array 配置数组
     * @MC_HtmlSymbol html文件的head部分
     * @MC_HtmlSymbol html文件的body部分
     *
     * 默认创建html文件如下
     * <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     * <html xmlns="http://www.w3.org/1999/xhtml">
     * <head>
     *      <meta  http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     *      <meta name="author" content="fenghao" />
     * </head>
     * <body>
     * </body>
     * </html>
     *
     */

    public function __construct($_conf=null, $_html_body=null, $_html_head=null){

        if($_conf == null){
            //$_conf = $_SERVER['MCPHP_CONFIG']['HTMLTemp'];
            $_conf = __get_config('HTMLTemp');
        }

        //读取模板头文件
        //try{
        //    $_head = ROOT_DIR.DS.$_conf['temp_dir'].DS."head.php";
        //    if(is_file($_head)){
        //       $this->header = require_once($_head);
        //    }else{
        //        die('can not read header file.');
        //    }
        //}
        $this->header = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

EOT;

        //$this->template_dir = 'template',
        $this->cache_dir      = ROOT_DIR.DS.$_conf['cache_dir'];
        $this->cache          = $_conf['cache'];
        $this->cache_lifetime = $_conf['cache_lifetime'];


        //创建默认的html页面
        //创建head部分
        $this->arr_HTML_Con['head'] = MC_HtmlSymbol::CreateHead();
        //设置语言
        $this->arr_HTML_Con['charset'] = MC_HtmlSymbol::CreateMeta(' http-equiv="Content-Type" content="text/html; charset='.($_conf['charset']?$_conf['charset']:'UTF-8').'"');
        $this->arr_HTML_Con['head']->setSon($this->arr_HTML_Con['charset']);
        if($_html_head != null){
            $this->arr_HTML_Con['charset']->setBrother($_html_head);
        }

        //创建body部分
        if($_html_body == null){
            //创建html的body部分
            $this->arr_HTML_Con['body'] = MC_HtmlSymbol::CreateBody();
        }else{
            $this->arr_HTML_Con['body'] = $_html_body;
        }

    }

    
    /**
     * 不被克隆
     *
     */
    private function __clone(){}

    /**
     * 取得给定HTML_Con的最后的没有兄弟的HTML_Con
     * @param MC_HtmlSymbol
     * @retrun MC_HtmlSymbol
     */
    private function getLastNoBrother($_HTML_Con_obj){

        $_tmp = $_HTML_Con_obj;

        while($_tmp->getBrother() != null){
            $_tmp = $_tmp->getBrother();
        }

        return $_tmp;
    
    }

    /**
     * 取得给定HTML_Con的最后的没有儿子的HTML_Con
     * @param MC_HtmlSymbol
     * @retrun MC_HtmlSymbol
     */
    private function getLastNoSon($_HTML_Con_obj){

        $_tmp = $_HTML_Con_obj;

        while($_tmp->getSon() != null){
            $_tmp = $_tmp->getSon();
        }

        return $_tmp;
    
    }

    
    /**
     * 将给定的MC_HtmlSymbol添加到html的head部分
     * @param MC_HtmlSymbol
     *
     */
    public function addHead($_head){
        $this->getLastNoBrother($this->arr_HTML_Con['charset'])->setBrother($_head);
    }

    /**
     * 将给定的MC_HtmlSymbol添加到html的body的最后
     * @param MC_HtmlSymbol
     *
     */
    public function addBody($_body){
        if($this->arr_HTML_Con['body']->getSon() == null){
            $this->arr_HTML_Con['body']->setSon($_body);
        }else{
            $this->getLastNoBrother($this->arr_HTML_Con['body']->getSon())->setBrother($_body);
        }
    }

    /**
     * 向当前的模板中给定的容器添加一个HTML代码容器
     * @param MC_HtmlSymbol
     */
    public function addHtmlSym($_parent_con, $_html_con){

        $this->arr_HTML_Con[$_parent_con]->setSon($_html_con);

        //将传入的HTML代码容器中有cssid的存入类中的数组
        $_cssid = $_html_con->getCSSid();
        $this->addSym2Arr($_html_con, $_cssid);
    }

    /**
     * 向当前的模板中的数组中添加元素
     * @param MC_HtmlSymbol
     */
    public function addSym2Arr($_html_con, $_key){
        $this->arr_HTML_Con[$_key] = $_html_con;
    }

    /**
     * 取得页面的HTML代码
     *
     */
    public function getHTMLCode(){
        $_content = $this->header;
        $_content .= $this->arr_HTML_Con['head']->getHTMLCode();
        $_content .= $this->arr_HTML_Con['body']->getHTMLCode();
        $_content .= "</html>";
        return $_content;
    }

    /**
     * 显示页面
     *
     */
    public function show(){
        echo $this->getHTMLCode();
    }

    //生成缓存文件
    function CreateCache($filename){

        $filename = $this->cache_dir.DS.$filename;

        if($this->file_write($filename, $this->getHTMLCode())===false){
            throw new MC_Exception("缓存 {$filename} 失败");
            return false;
        }
        return true;
    }



    //输出内容到文件
    //@param $filename 文件名
    //@param $content 写入内容
    //@return 成功返回 true 失败返回 false
    function file_write($filename, $content=""){
        if($filename == ""){
            $this->errorLog("没有指定文件名");
            return false;
        }
        
        $f = new MC_FileBase($filename);
        //备份已有的文件
        if(is_file($filename)){
            if($f->CopyFile() === false){
                $this->errorLog("文件 $filename 备份失败 ". $f->getErrMsg());
            }
        }
        return $f->WriteFile($content);
    }
} 

?>
